package com.topgay.controller;

import java.util.List;

import javax.activation.FileDataSource;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import javax.servlet.http.HttpSession;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.mail.MailException;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.ModelAndView;

import com.topgay.domain.CSCenter;
import com.topgay.domain.Declaration;
import com.topgay.domain.Member;
import com.topgay.domain.ValueStrings;
import com.topgay.service.CSCenterService;
import com.topgay.util.BoardUtilities;
import com.topgay.util.PagingBean;

/**
 * @author Harry
 * 20141110_01
 */
@Controller
@RequestMapping("/admin/cscenter/")
public class AdminCSCenterController {

	@Autowired
	private CSCenterService cscenterService;
	
	@Autowired
	private JavaMailSender mailSender;
	
	//CS Center - 공지사항/FAQ/Q&A/신고하기
	@RequestMapping("/login/list.do")
	public String getList(@RequestParam(defaultValue="1")String page, @RequestParam(defaultValue="5")String divide, ModelMap model) throws Exception{
		int pageNo = 1;
		int nDivide = 1;
		try {
			pageNo = Integer.parseInt(page);
		}catch(Exception e){
			pageNo = 1;
		}
		
		try {
			nDivide = Integer.parseInt(divide);
		}catch(Exception e){
			nDivide = 1;
		}
		
		model = BoardUtilities.getCSCenterTitle(model, nDivide);
		
//		return "admin/cscenter_notice";
//		return cscenterList(pageNo, 5, model, "admin/cscenter_notice");
		List<CSCenter> list = cscenterService.getCSCenterList(pageNo, nDivide);
		model.addAttribute("cscenterList", list);
		
//		2. PagingBean객체를 생성 ( 필요 정보 : 전체 게시물의 개수, 보고자 하는 페이지 번호)
//		2-1 : DAO의 메소드를 이용해 전체 게시물 수 조회
		int totalContent = cscenterService.getTotalContent(nDivide);
		
//		2-2 : PagingBean 객체 생성
		PagingBean pagingBean = new PagingBean(totalContent, pageNo);
		model.addAttribute("pagingBean", pagingBean);
		
//		2-3 : divide 저장
		model.addAttribute("page", page);
		model.addAttribute("divide", divide);
		
		String url = null;
		if(8==nDivide){
			url = "admin/cscenter_declaration_list";
		}else{
			url = "admin/cscenter_list";
		}
		
		//TODO - cscenterService.getCSCenterList에서 댓글 수 삽입 처리
		
		return url;
		
	}
	
	

	/**
	 * 공지사항 - 글쓰기 양식
	 * @return
	 */
	@RequestMapping("/login/writeForm.do")
	public String writeForm(String divide, String page, ModelMap model){
		int nDivide = 1;
		try {
			nDivide = Integer.parseInt(divide);
		}catch(Exception e){
			nDivide = 1;
		}
		model.addAttribute("divide", nDivide);
		model.addAttribute("page", page);
		
		model = BoardUtilities.getCSCenterTitle(model, nDivide);
		
		return "admin/cscenter_write_form";
	}
	
	/**
	 * 공지사항 - 글쓰기 처리 & 처리후 View 리턴
	 * @return
	 */
	@RequestMapping("/login/writeContent.do")
//	public ModelAndView writeContent(CSCenter cscenter, String divide, HttpSession session){
//	public String writeContent(CSCenter cscenter, ModelMap model,HttpSession session){
	public String writeContent(CSCenter cscenter, @RequestParam(required=false) String email, String page, ModelMap model, HttpSession session){
		
		/*int nDivide = 1;
		try {
			nDivide = Integer.parseInt(divide);
		}catch(Exception e){
			nDivide = 1;
		}*/
		int pageNo = 1;
		try {
			pageNo = Integer.parseInt(page);
		}catch(Exception e){
			pageNo = 1;
		}
		
		Member member = (Member)session.getAttribute("login_admin_info");
		cscenter.setId(member.getId());
		cscenter.setNickname(member.getNickname());
		cscenter.setEmail(member.getEmail());
//		cscenter.setDivide(nDivide);
		cscenter.setDivide(cscenter.getDivide());
		
//		2. Business Logic - Model(Business Service)로 요청
		cscenterService.setWriteContent(cscenter);
		
		model.addAttribute("page", pageNo);
		
		model = BoardUtilities.getCSCenterTitle(model, cscenter.getDivide());
		
//		return new ModelAndView("redirect:/admin/cscenter/login/getContent.do?no="+cscenter.getCscenterNo()+"&divide="+divide);
		return "redirect:/admin/cscenter/login/getContent.do?no="+cscenter.getCscenterNo();
	}
	
	
	/**
	 * 한개의 글(게시물)을 조회하는 handler 메소드
	 * 
	 * @param no - 조회하고자 하는 글번호
	 * @param page - 조회하고자 하는 페이지 번호
	 * @param model - 조회한 글 데이터를 저장할 ModelMap
	 * @return
	 */
	@RequestMapping("/login/getContent.do")
//	public String getContent(String no, @RequestParam(defaultValue="1")String page, String divide, ModelMap model){
	public String getContent(String no, @RequestParam(defaultValue="1")String page, ModelMap model){
		String url = null;
		int cscenterNo = 1;
		try {
			cscenterNo = Integer.parseInt(no);
		}catch(Exception e){
			cscenterNo = 1;
		}
//		int nDivide = 1;
//		try {
//			nDivide = Integer.parseInt(divide);
//		}catch(Exception e){
//			nDivide = 1;
//		}
		
		CSCenter cscenter = null;
		try {
			//2. Business Logic 요청 - Model
			cscenter = cscenterService.getCSCenterContentByNo(cscenterNo);
			
			model.addAttribute("cscenter", cscenter);
			model.addAttribute("page", page);
//			model.addAttribute("divide", divide);
			
//			model = BoardUtilities.getCSCenterTitle(model, nDivide);
			model = BoardUtilities.getCSCenterTitle(model, cscenter.getDivide());
			
			url = "admin/cscenter_show_content";
		}catch(Exception e){
			e.printStackTrace();
			model.addAttribute("error_msg", "글 조회도중 오류 발생 : "+e.getMessage());
			url = "redirect:/admin/error.jsp";
		}
		return url;
	}
	
	/**
	 * 한개의 글(게시물)을 조회하는 handler 메소드 : getContent.do
	 * 
	 * getContent.do 에서 
	 * 수정 폼에서 취소 키 눌렀을 때 조회값 증가 X
	 * 
	 * @param no - 조회하고자 하는 글번호
	 * @param page - 조회하고자 하는 페이지 번호
	 * @param model - 조회한 글 데이터를 저장할 ModelMap
	 * @return
	 */
	@RequestMapping("/login/getContentBack.do")
	public String getContentBack(String no, @RequestParam(defaultValue="1")String page, ModelMap model){
//	public String getContentBack(String no, @RequestParam(defaultValue="1")String page, String divide, ModelMap model){
		String url = null;
		int cscenterNo = 1;
		int nDivide = 1;
		try {
			cscenterNo = Integer.parseInt(no);
		}catch(Exception e){
			cscenterNo = 1;
		}
//		try {
//			nDivide = Integer.parseInt(divide);
//		}catch(Exception e){
//			nDivide = 1;
//		}
		
		CSCenter cscenter = null;
		try {
			//2. Business Logic 요청 - Model
			cscenter = cscenterService.getCSCenterContentByNoNotViewCount(cscenterNo);
			
			model.addAttribute("cscenter", cscenter);
			model.addAttribute("page", page);
//			model.addAttribute("divide", divide);
			
//			model = BoardUtilities.getCSCenterTitle(model, nDivide);
			model = BoardUtilities.getCSCenterTitle(model, cscenter.getDivide());
			
			url = "admin/cscenter_show_content";
		}catch(Exception e){
			e.printStackTrace();
			model.addAttribute("error_msg", "글 조회도중 오류 발생 : "+e.getMessage());
			url = "redirect:/admin/error.jsp";
		}
		return url;
	}
	
	
	/**
	 * 수정폼 으로 이동을 처리하는 handler 메소드
	 * @param no - 수정할 글 번호. 이 번호의 글을 조회해서 응답처리한다.
	 * @param model - 수정할 글 데이터를 View에 전송하기 위한 ModelMap
	 * @return
	 */
	@RequestMapping("/login/modifyForm.do")
	public String modifyForm(String no, String page, ModelMap model){
		String url = null;
		
		int cscenterNo = 1;
		try {
			cscenterNo = Integer.parseInt(no);
		}catch(Exception e){
			cscenterNo = 1;
		}
		
		try {
			CSCenter cscenter = cscenterService.getContentByNoForForm(cscenterNo);
			model.addAttribute("cscenter", cscenter);
			model.addAttribute("page", page);
			
			model = BoardUtilities.getCSCenterTitle(model, cscenter.getDivide());
			
			url = "admin/cscenter_modify_form";
			
		}catch(Exception e){
			e.printStackTrace();
			model.addAttribute("error_msg", "글 조회도중 오류 발생 : "+e.getMessage());
			url = "redirect:/admin/error.jsp";
		}
		return url;
	}
	
	/**
	 * 수정폼에서 수정한 글을 처리하기 위한 Handler 메소드
	 * 
	 * @param cscenter
	 * @param page
	 * @return
	 */
	@RequestMapping("/login/modifyContent.do")
	public ModelAndView modifyContent(CSCenter cscenter, String page){
		System.out.println("[modifyContent.do]");
		ModelAndView mv = null;
		try {
			cscenterService.modifyContent(cscenter);
			mv = new ModelAndView("redirect:/admin/cscenter/login/getContent.do?no="+cscenter.getCscenterNo()+"&page="+page);
		}catch(Exception e){
			e.printStackTrace();
			mv = new ModelAndView("redirect:/admin/error.jsp", "error_msg", "수정 처리중 오류 발생" + e.getMessage());
		}
		return mv;
	}
	
	/**
	 * 글 삭제 처리 handler 메소드
	 * @param cscenterNo
	 * @param page
	 * @param model
	 * @return
	 */
	@RequestMapping("/login/deleteContent.do")
//	public String deleteContent(String no, String page, String divide, ModelMap model){
//	public String deleteContent(String no, String page, ModelMap model){
	public String deleteContent(String no, String page, String divide, ModelMap map){
		String url = null;
		int cscenterNo = 1;
		try {
			cscenterNo = Integer.parseInt(no);
		}catch(Exception e){
			cscenterNo = 1;
		}
		try {
			CSCenter cscenter = cscenterService.getCSCenterContentByNoNotViewCount(cscenterNo);
			cscenterService.deleteContentByNo(cscenterNo);
			//TODO : 해당 cscenterNo에 일치되는 답변 글 모두 삭제 처리 
		
			url = "redirect:/admin/cscenter/login/list.do?page="+page+"&divide="+cscenter.getDivide();
		} catch(Exception e){
			e.printStackTrace();
			map.addAttribute("error_msg", "글 조회도중 오류 발생 : "+e.getMessage());
			url = "redirect:/admin/error.jsp";
		}
		return url;
	}
	
	/**
	 * Q&A 이메일 전송 처리
	 * @return
	 */
	@RequestMapping(value="/login/sendEmailForReply.do", method=RequestMethod.POST )
	public String doSendEmail(String no, String contentForReply, String page, ModelMap model){

		System.out.println("[sendEmailForReply.do]contentForReply="+contentForReply);
		
		int cscenterNo = 1;
		try {
			cscenterNo = Integer.parseInt(no);
		}catch(Exception e){
			cscenterNo = 1;
		}
		
		CSCenter cscenter = cscenterService.getCSCenterContentByNoNotViewCount(cscenterNo);
		
		MimeMessage message = mailSender.createMimeMessage();
		
		try {
			/*
			//HTML O, 파일첨부  X, 
			message.setSubject(ValueStrings.getInstance().getEmailTitleForQna(), "UTF-8");
			
			String htmlContent = ValueStrings.getInstance().getEmailContentForQna();
			message.setText(htmlContent, "UTF-8", "html");
			message.setFrom(new InternetAddress(ValueStrings.getInstance().getEmailSenderEmailForQna()));
			message.addRecipient(RecipientType.TO, new InternetAddress(cscenter.getEmail()));
			*/
			
			//HTML O, 파일첨부 O, 파일 삽입 O
			MimeMessageHelper messageHelper = new MimeMessageHelper(message, true, "UTF-8");
			messageHelper.setSubject(ValueStrings.getInstance().getEmailTitleForQna());
			
			String htmlContent = 
					ValueStrings.getInstance().getEmailContentForQna()
					+ "<h3>요청하신 질문</h3>"
					+ "<p>"+cscenter.getContent()+"</p>"
					+ "<h3>답변</h3>"
					+ "<p>"+BoardUtilities.changeContentForDB(contentForReply)+"</p>";
			
			messageHelper.setText(htmlContent, true);
			messageHelper.setFrom(
					ValueStrings.getInstance().getEmailSenderEmailForQna()
					, ValueStrings.getInstance().getEmailSenderNameForQna());
			messageHelper.setTo(new InternetAddress(cscenter.getEmail(), cscenter.getNickname(), "UTF-8"));
//			messageHelper.addAttachment(MimeUtility.encodeText("logo.png", "UTF-8", "B"), new FileDataSource(
//					"D:\\project\\server\\apache-tomcat-6.0.41\\webapps\\TopGay\\images\\web\\logomain.png"
////					"C:\\day\\apache-tomcat-6.0.41\\webapps\\TopGay\\images\\web\\images\\web\\logomain.png"
//					));
			messageHelper.addInline("fytl",  new FileDataSource(
					ValueStrings.getInstance().getLogoImageForEmail()
//					"C:\\day\\apache-tomcat-6.0.41\\webapps\\TopGay\\images\\web\\logomain_s.png"
					));
			
		} catch (Throwable e) {
			e.printStackTrace();
			return "redirect:/admin/error.jsp";
		}
		
		try {
			mailSender.send(message);
		}catch(MailException e){
			e.printStackTrace();
		}
		
//		return "redirect:/admin/cscenter/login/getContentBack.do?no="+cscenter.getCscenterNo()+"&page="+page+"&divide="+cscenter.getDivide();
		return "redirect:/admin/cscenter/login/getContentBack.do?no="+cscenter.getCscenterNo()+"&page="+page;
	}
	
	
	/**
	 * CS Center - 신고하기 목록
	 * @param page
	 * @param divide
	 * @param model
	 * @return
	 * @throws Exception
	 */
	@RequestMapping("/login/declarationList.do")
	public String getDeclarationList(@RequestParam(defaultValue="1")String page, ModelMap model) throws Exception{
		int pageNo = 1;
		try {
			pageNo = Integer.parseInt(page);
		}catch(Exception e){
			pageNo = 1;
		}
		
		model = BoardUtilities.getCSCenterTitle(model, 8);
		
		List<Declaration> list = cscenterService.getDeclarationList(pageNo);
		model.addAttribute("declarationList", list);
		
//		2. PagingBean객체를 생성 ( 필요 정보 : 전체 게시물의 개수, 보고자 하는 페이지 번호)
//		2-1 : DAO의 메소드를 이용해 전체 게시물 수 조회
		int totalContent = cscenterService.getDeclarationTotalContent();
		
//		2-2 : PagingBean 객체 생성
		PagingBean pagingBean = new PagingBean(totalContent, pageNo);
		model.addAttribute("pagingBean", pagingBean);
		
		return "admin/cscenter_declaration_list";
		
	}
	
	/**
	 * 한개의 글(게시물)을 조회하는 handler 메소드
	 * 
	 * @param no - 조회하고자 하는 글번호
	 * @param page - 조회하고자 하는 페이지 번호
	 * @param model - 조회한 글 데이터를 저장할 ModelMap
	 * @return
	 */
	@RequestMapping("/login/getDeclarationContent.do")
	public String getDeclarationContent(String no, @RequestParam(defaultValue="1")String page, ModelMap model){
		String url = null;
		int declarationNo = 1;
		try {
			declarationNo = Integer.parseInt(no);
		}catch(Exception e){
			declarationNo = 1;
		}
		
		model = BoardUtilities.getCSCenterTitle(model, 8);
		
		Declaration declaration = null;
		try {
			//2. Business Logic 요청 - Model
			declaration = cscenterService.getDeclarationContentByNo(declarationNo);
			
			model.addAttribute("declaration", declaration);
			model.addAttribute("page", page);
			
			url = "admin/cscenter_declaration_show_content";
		}catch(Exception e){
			e.printStackTrace();
			model.addAttribute("error_msg", "글 조회도중 오류 발생 : "+e.getMessage());
			url = "redirect:/admin/error.jsp";
		}
		return url;
	}
	
	/**
	 * 글 삭제 처리 handler 메소드
	 * @param cscenterNo
	 * @param page
	 * @param model
	 * @return
	 */
	@RequestMapping("/login/deleteDeclarationContent.do")
	public String deleteDeclarationContent(String no, String page, ModelMap model){
		
		System.out.println("[deleteDeclarationContent]");
		String url = null;
		int declarationNo = 1;
		try {
			declarationNo = Integer.parseInt(no);
		}catch(Exception e){
			declarationNo = 1;
		}
		
		model = BoardUtilities.getCSCenterTitle(model, 8);
		try {
			cscenterService.deleteDeclarationContentByNo(declarationNo);
		
			url = "redirect:/admin/cscenter/login/declarationList.do.do?page="+page;
		} catch(Exception e){
			e.printStackTrace();
			model.addAttribute("error_msg", "글 조회도중 오류 발생 : "+e.getMessage());
			url = "redirect:/admin/error.jsp";
		}
		return url;
	}
	
	
	/**
	 * 답변 글을 등록하는 handler 메소드
	 */
	@RequestMapping("/login/replyContent.do")
	public void replyContent(){
		//TODO
	}
	/**
	 * 답변 목록
	 */
	public void getListReply(){
		//TODO
	}
	/**
	 * 답변 삭제
	 */
	public void deleteReply(){
		//TODO
	}
	
}
